package com.serverTechnology.resource.service.impl;


import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.serverTechnology.resource.entity.dto.DispositionUpdateDto;
import com.serverTechnology.resource.entity.vo.DispositionVo;
import com.serverTechnology.resource.entity.vo.ParamInsertFidVo;
import com.serverTechnology.resource.resourceEnum.DispositionEnum;
import com.serverTechnology.resource.entity.DispositionEntity;
import com.serverTechnology.resource.entity.dto.DispositionAddDto;
import com.serverTechnology.resource.entity.vo.InsertFidAndNameVo;
import com.serverTechnology.resource.mapper.DispositionMapper;
import com.serverTechnology.resource.service.IDispositionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;


/**
 * <p>
 * 配置参数表 服务实现类
 * </p>
 *
 * @author 王烁
 * @since 2024-07-28
 */
@Service("DispositionServiceImpl")
public class DispositionServiceImpl extends ServiceImpl<DispositionMapper, DispositionEntity> implements IDispositionService {
    @Autowired
    private DispositionMapper dispositionMapper;


    /**
     * 新增配置参数
     *
     * @param dispositionAddDto 请求参数
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void add(List<DispositionAddDto> dispositionAddDto) {
        // 创建一个新的处置实体对象
        ArrayList<DispositionEntity> dispositionEntities = new ArrayList<>();
        for (DispositionAddDto addDto : dispositionAddDto) {
            DispositionEntity dispositionEntity = new DispositionEntity();
            BeanUtils.copyProperties(addDto, dispositionEntity);
            dispositionEntities.add(dispositionEntity);
        }
        // 调用 Mapper 将实体对象插入数据库
        this.saveBatch(dispositionEntities);
    }

    /**
     * 查询配置参数表所属id
     *
     * @param deviceId
     * @return
     */
    @Override
    public List<ParamInsertFidVo> findPage(Long deviceId) {
        // 使用 LambdaQueryWrapper 创建查询条件，限定查询条件为设备ID等于给定的 deviceId
        LambdaQueryWrapper<DispositionEntity> dispositionEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //查询条件
        dispositionEntityLambdaQueryWrapper.eq(DispositionEntity::getDeviceId, deviceId);

        // 调用 dispositionMapper 的 selectList 方法执行查询，获取处置信息列表
        List<DispositionEntity> dispositionEntities = dispositionMapper.selectList(dispositionEntityLambdaQueryWrapper);

        // 将查询到的 DispositionEntity 列表转换为 InsertFidAndNameVo 列表
        List<ParamInsertFidVo> insertFidAndNameVos = BeanUtil.copyToList(dispositionEntities, ParamInsertFidVo.class);
        for (ParamInsertFidVo insertFidAndNameVo : insertFidAndNameVos) {
            if (insertFidAndNameVo.getFid()==0){
                insertFidAndNameVo.setIsExist(true);
            }else {
                insertFidAndNameVo.setIsExist(false);
            }
        }


        // 返回转换后的 InsertFidAndNameVo 列表
        return insertFidAndNameVos;
    }

    /**
     * 根据设备ID查询所有的处置信息，并将结果转换为 DispositionVo 列表返回。
     *
     * @param deviceId 设备ID，用于查询相关的处置信息
     * @return 包含处置信息的 DispositionVo 列表
     *
     * @throws IllegalArgumentException 如果 deviceId 为 null 或小于等于零
     */
    @Override
    public List<DispositionVo> selectAll(Long deviceId) {
        // 使用 LambdaQueryWrapper 创建查询条件，限定查询条件为设备ID等于给定的 deviceId
        LambdaQueryWrapper<DispositionEntity> eq = new LambdaQueryWrapper<DispositionEntity>().eq(DispositionEntity::getFid, deviceId);

        // 调用 dispositionMapper 的 selectList 方法执行查询，获取处置信息列表
        List<DispositionEntity> list = dispositionMapper.selectList(eq);

        // 将查询到的 DispositionEntity 列表转换为 DispositionVo 列表
        List<DispositionVo> dispositionVos = BeanUtil.copyToList(list, DispositionVo.class);

        // 返回转换后的 DispositionVo 列表
        return dispositionVos;
    }




}
